package com.kaifamiao.date1110;

/**
 * 1、编译时类型
 * 		声明变量时指定的类型就是编译时类型
 *      编译时类型决定了可以访问哪些字段、调用哪些方法
 * 2、运行时类型
 *      程序运行期间，父类类型的引用变量指向那个对象，运行时类型就是那个对象对应的类型
 *      通过 getClass() 方法可以获得运行时类型
 * 3、向上转型
 *      将子类类型的对象直接赋值给父类类型的引用变量被称作"向上转型"
 */
public class AnimalTest {

	public static void main(String[] args) {
		// 声明变量时指定的类型就是【编译时类型】
		Animal a = null ;
		Class<?> c = null ;
		
		// 将子类类型的对象直接赋值给父类类型的引用变量被称作"向上转型"
		a = new Birds();
		System.err.println( System.identityHashCode( a ) );
		// 运行期间，引用变量 a 指向那个对象就调用那个对象的 eat 方法
		a.eat( "红烧肉" );
		c = a.getClass(); // 获得引用变量 a 指向那个对象的类型(即运行时类型)
		System.err.println( c );
		
		// 将子类类型的对象直接赋值给父类类型的引用变量被称作"向上转型"
		a = new Beast();
		System.err.println( System.identityHashCode( a ) );
		// 运行期间，引用变量 a 指向那个对象就调用那个对象的 eat 方法
		a.eat( "盐煎肉" );
		c = a.getClass(); // 获得引用变量 a 指向那个对象的类型(即运行时类型)
		System.err.println( c );
	}

}
